/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufpb.projetoesa.comunicacao;

//import br.ufpb.projetoesa.exceptions.AtualizacaoDeProjetoException;
import br.ufpb.projetoesa.exceptions.CursoInexistenteException;
import br.ufpb.projetoesa.exceptions.DisciplinaInexistenteException;
import br.ufpb.projetoesa.exceptions.ProjetoInexistenteException;
import java.util.List;
import br.ufpb.projetoesa.exceptions.AtualizacaoDeProfessorException;
import br.ufpb.projetoesa.exceptions.DisciplinaInvalidaException;
import br.ufpb.projetoesa.negocio.Centro;
import br.ufpb.projetoesa.negocio.Departamento;
import br.ufpb.projetoesa.negocio.Professor;
import br.ufpb.projetoesa.exceptions.ProfessorInexistenteException;
import br.ufpb.projetoesa.negocio.Projeto;
import br.ufpb.projetoesa.exceptions.RemocaoDeAlunosImpossivelException;
import br.ufpb.projetoesa.negocio.Turma;
import br.ufpb.projetoesa.exceptions.TurmaInexistenteException;
import br.ufpb.projetoesa.negocio.Disciplina;

/**
 *
 * @author Rennan
 */
public class Facade {
    
    private Departamento dep;
    private Centro centro;
    private static Facade fachada;
    
    
    //Singleton
    public static Facade getInstance(){
        if (fachada == null){
            fachada = new Facade();
            return fachada;
        }
        return fachada;
    }
    
    public Facade(){
        dep = new Departamento();
        centro = new Centro("CCAE");
        
    }
    
    /**
     * Chama o método do departamento que cadastra um professor.
     * @param _p Professor a ser cadastrado.
     */
    public void cadastraProfessores(Professor _p){
        dep.addProfessor(_p);
    }

    /**
     * Chama o método de departamento que retora a lista com os professores cadastrados.
     * @return Lista de professores do departamento.
     */
    public List getListaDeProfessores() {
        return dep.getProfessores();
    }
    
    /**
     * Chama o método de atualização de professor de Departamento.
     * @param profAtual Professor a ser alterado.
     * @param profModificado Professor modificado.
     * @throws AtualizacaoDeProfessorException 
     */
    public void atualizarProfessor(Professor profAtual, Professor profModificado) 
            throws AtualizacaoDeProfessorException {
        dep.atualizaProfessor(profAtual, profModificado);
    }
    
    /**
     * Usa o método de Departamento que pesquisa todas as evidências de Professores com o este nome.
     * @param nome Nome completo ou parcial do Professor.
     * @return Lista de professores que batem com o String passado.
     * @throws ProfessorInexistenteException 
     */
    public List<Professor> pesquisarEvidenciasDeProfessores(String nome) throws ProfessorInexistenteException{
        return dep.pesquisaProfessores(nome);
    }
    
    /**
     * Usa o método de Departamento que pesquisa um Professor pelo seu nome e retorna o Professor
     * se encontrar, caso contrário, lança uma exceção.
     * @param nome Nome do professor.
     * @return Professor do departamento.
     * @throws ProfessorInexistenteException 
     */
    public Professor pesquisaProfessorNome(String nome) throws ProfessorInexistenteException{
        return dep.getProfessorNome(nome);
    }
    
    /**
     * Pesquisa uma Professor pela sua matrícula e retorna o Professor
     * se encontrar, caso contrário, lança uma exceção.
     * @param mat Matrícula do professor.
     * @return Professor do departamento.
     * @throws ProfessorInexistenteException 
     */
    public Professor pesquisaProfessorMatricula(String mat) throws ProfessorInexistenteException{
        return dep.getProfessorMat(mat);
    }
    
    /**
     * Chama o método de departamento que retorna todos os professores cadastrados.
     * @return Lista de Professores cadastrados.
     */
    public List<Professor> getProfessores(){
        return dep.getProfessores();
    }
    
// ---> TURMA
    
    /**
     * Cadastra uma nova turma no departamento
     * @param Turma
     */
    public void cadastraTurma(Turma turma){
        dep.addTurma(turma);
    }
    
    /**
     * Cadastra uma nova turma no departamento
     * @param identificação da Turma
     */
    public void cadastraTurma(String id){
        dep.addTurma(id);
    }
    
    /**
     * Cadastra uma nova turma no departamento
     * @param String id = identificação da Turma
     * @param int qtdAlunos = quantidade de alunos desta Turma
     */
    public void cadastraTurma(String id, int qtdAlunos){
        dep.addTurma(id, qtdAlunos);
    }
    
    /**
     * Localiza uma turma pela sua identificação (ID).
     * @param identificação da Turma
     * @return Turma
     * @exception TurmaInexistenteException
     */
    public Turma localizaTurmaID(String id) throws TurmaInexistenteException{
        return dep.getTurmaID(id);
    }
    
    
    /**
     * Remove uma Turma pela sua identificação (ID).
     * @param identificação da Turma
     * @exception TurmaInexistenteException
     */
    public void removerTurmaID(String id) throws TurmaInexistenteException{
        dep.removerTurma(id);
    }
    
    /**
     * Remove uma Turma pela sua identificação (ID).
     * @param Turma
     * @exception TurmaInexistenteException
     */
    public void removerTurmaID(Turma t) throws TurmaInexistenteException{
        dep.removerTurma(t);
    }    
    
    /**
     * Verifica se esta Turma esta cadastrada.
     * @return true se esta Turma estiver cadastrada e false caso contrário.
     */
    public boolean isTurmaCadastrada(Turma t){
        return dep.containsTurma(t);
    }
    
    
    /**
     * Retorna todas as turmas já cadastradas
     * @return Lista com todas as Turmas cadastradas.
     */
    public List<Turma> getTurmasCadastradas(){
        return dep.getTurmas();
    }
    
// ---> FIM TURMA    
    
    /**
     * Remove uma quantidade de alunos da base de dados. A Turma deve ser
     * identificada antes da remoção através do "id".
     */
    public void removerAlunosCadastrados(String id, int qtd) throws TurmaInexistenteException,
            RemocaoDeAlunosImpossivelException{
        
        dep.removerAlunos(id, qtd);
    }

    /**
     * Adiciona um Projeto a um Professor
     */
    public void cadastrarProjeto(Professor prof, Projeto proj){
        prof.addProjeto(proj);
    }
    
   /*
     * Retorna lista de projetos do professor que contenha parte ou toda a string nome passada 
     * como parametro, no atributo nome do projeto.
     */
   public void pesquisarProjeto(Professor prof, String nome) throws ProjetoInexistenteException{
       prof.pesquisarProjetos(nome);
   }
   
   /*
    * Retorna a lista de projetos de um professor
    */
   public List<Projeto> getProjetos(Professor prof){
       return prof.getProjetos();
   }
   
   /*
    * Retorna o projeto cujo atributo nome é igual a string nome passada por parametro.
    */
   public Projeto getProjeto(Professor p,String nome) throws ProjetoInexistenteException{
       return p.getProjeto(nome);
   }
   
   /*
    * Remove o projeto passado como parametro da lista de projetos do professor.
    */
   public void removerProjeto(Professor p, Projeto proj) throws ProjetoInexistenteException{
       p.removerProjeto(proj);
   }
    
   /*
    * Remove o projeto, cujo o nome é igual a sting passada por parametro, da lista de projetos do professor.
    */
   public void removerProjetoPorNome(Professor p, String nome) throws ProjetoInexistenteException{
       p.removerProjeto(nome);
   }
   
   /*
    * Atualiza o projeto old pelo o projeto niu
    */
   public void atualizarProjeto(Professor p, Projeto old, Projeto niu) throws ProjetoInexistenteException{
       p.atualizarProjeto(old, niu);
   }
    /**
     * Remove um Professor da Base de Dados
     */
    public void removerProfessor(Professor prof){
        dep.removerProfessor(prof);
    }
    
    
    /**
     * Adiciona uma nova disciplina
     */
    public void addDisciplina(String id, String nome) throws DisciplinaInvalidaException {
        addDisciplina(id, nome, 0);
    }
    
    /**
     * Adiciona uma nova disciplina
     */
    public void addDisciplina(String id, String nome, int creditos) throws DisciplinaInvalidaException {
        centro.addDisciplina(id, nome, creditos);
    }
    
    public List<Disciplina> getDisciplinas(){
        return centro.getDisciplinas();
    }
    
//    public void removeDisciplinaDeUmCurso(Curso curso, String id) throws CursoInexistenteException, DisciplinaInexistenteException{
//        centro.removeDisciplinaDeUmCurso(curso, id);
//    }
    
    
    
}
